package com.kgc.scd.util;

import com.kgc.scd.constant.CommonConstant;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Created On : 2022/11/12.
 * <p>
 * Author : zhukang
 * <p>
 * Description: 敏感字工具类
 */
public class SensitiveWordUtil {

    /**
     * @param : [java.lang.String]
     * @return : java.lang.String
     * @author : zhukang
     * @date : 2022/11/12
     * @description : 获取敏感字key
     */
    public static String getSensitiveWordKey(String sensitiveKey) {
        return StringUtils.isEmpty(sensitiveKey) ? CommonConstant.SENSITIVE_WORD_PREFIX : sensitiveKey;
    }

    /**
     * @author : zhukang
     * @date   : 2022/11/12
     * @param  : [java.util.Set<java.lang.String>]
     * @return : java.util.Map
     * @description : 将HashSet中的敏感词,存入HashMap中
     */
    public static Map addSensitiveWordToHashMap(Set<String> wordSet) {
        // 初始化敏感词容器，减少扩容操作
        Map<String, Object> sensitiveWordMap = new HashMap(wordSet.size());
        for (String word : wordSet) {
            Map<String, Object> nowMap = sensitiveWordMap;
            for (int i = 0; i < word.length(); i++) {
                // 转换成char型
                char keyChar = word.charAt(i);

                // 获取
                Object tempMap = nowMap.get(String.valueOf(keyChar));

                // 如果存在该key，直接赋值
                if (tempMap != null) {
                    // 一个一个放进Map中
                    nowMap = (Map) tempMap;
                }
                // 不存在则，则构建一个map，同时将isEnd设置为0，因为他不是最后一个
                else {
                    // 设置标志位，不是最后一个
                    Map<String, Object> newMap = new HashMap<>();

                    // 没有这个key，就把(isEnd，0) 放在Map中
                    newMap.put("isEnd", "0");

                    // 添加到集合，第一个字为key，比如：法论功，集合中为{"法":{"isEnd":0}}
                    nowMap.put(String.valueOf(keyChar), newMap);

                    // 使用map集合的引用传递，确保同一个词语后面的字不停追加到第一个字的key的value中
                    // 比如：法论功，第一次集合中为{"法":{"isEnd":0}}，第二次循环，{"法":{"isEnd":"0", {"轮":{"isEnd":"0"}}}}
                    // 第三次循环，第二次循环，{"法":{"论":{"isEnd":"0","功":{"isEnd":"0"}},"isEnd":"0"}}
                    nowMap = newMap;
                }

                // 最后一个
                if (i == word.length() - 1) {
                    nowMap.put("isEnd", "1");
                }
            }
        }

        return sensitiveWordMap;
    }

}
